home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Workbench Add-On
/
Workbench Add-On - Volume 1.iso
/
BBS-Archive
/
Comm
/
term-source.lha
/
Extras
/
Source
/
term-Source.lha
/
FixPath.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-02-07
|
5KB
|
231 lines
/*
** FixPath.c
**
** Fix the current Process search patch list by faking a CLI
**
** Copyright © 1990-1995 by Olaf `Olsen' Barthel
** All Rights Reserved
**
** :ts=4
*/
#include "termGlobal.h"
/* This is how a linked list of directory search paths looks like. */
struct Path
{
BPTR path_Next; // Pointer to next entry
BPTR path_Lock; // The drawer in question
};
/* CloneBString(BSTR Contents,WORD Len):
*
* Reserve space for a BString, optionally copy an
* existing BString into the new string.
*/
STATIC BSTR __regargs
CloneBString(BSTR Contents,WORD Len)
{
UBYTE *Source,
*String;
if(Contents)
{
Source = BADDR(Contents);
if(*Source > Len)
Len = *Source;
}
else
Source = NULL;
if(String = AllocVec(Len + 1,MEMF_ANY))
{
if(Source)
CopyMem(Source,String,((WORD)*String) + 1);
else
*String = 0;
}
return(MKBADDR(String));
}
/* FreeBString(BSTR String):
*
* Free the memory allocated for a BString.
*/
STATIC VOID __regargs
FreeBString(BSTR String)
{
APTR Mem = BADDR(String);
if(String)
FreeVec(Mem);
}
/* DeletePath(BPTR StartPath):
*
* Delete a path list as created by CreatePath().
*/
STATIC VOID __regargs
DeletePath(BPTR StartPath)
{
struct Path *First,
*Next;
for(First = BADDR(StartPath) ; First ; First = Next)
{
Next = BADDR(First -> path_Next);
UnLock(First -> path_Lock);
FreeVec(First);
}
}
/* ClonePath(BPTR StartPath):
*
* Clone a given path list.
*/
STATIC BPTR __regargs
ClonePath(BPTR StartPath)
{
struct Path *First = NULL,
*Last = NULL,
*List,
*New;
for(List = BADDR(StartPath) ; List ; List = BADDR(List -> path_Next))
{
if(New = AllocVec(sizeof(struct Path),MEMF_ANY))
{
if(!(New -> path_Lock = DupLock(List -> path_Lock)))
{
FreeVec(New);
DeletePath(MKBADDR(First));
return(NULL);
}
else
New -> path_Next = NULL;
}
else
{
DeletePath(MKBADDR(First));
return(NULL);
}
if(Last)
Last -> path_Next = MKBADDR(New);
if(!First)
First = New;
Last = New;
}
return(MKBADDR(First));
}
/* DeleteCLI(struct CommandLineInterface *CLI):
*
* Delete a CLI structure as created by CloneCLI.
*/
VOID __regargs
DeleteCLI(struct CommandLineInterface *CLI)
{
if(CLI)
{
DeletePath(CLI -> cli_CommandDir);
Close(CLI -> cli_CurrentOutput);
Close(CLI -> cli_CurrentInput);
FreeBString(CLI -> cli_CommandFile);
FreeBString(CLI -> cli_Prompt);
FreeBString(CLI -> cli_CommandName);
FreeBString(CLI -> cli_SetName);
FreeVec(CLI);
}
}
/* CloneCLI(struct Message *Message):
*
* Clone a CLI structure, as supplied by another process.
*/
struct CommandLineInterface * __regargs
CloneCLI(struct Message *Message)
{
struct Process *Source;
if(!Message -> mn_ReplyPort || (Message -> mn_ReplyPort -> mp_Flags & PF_ACTION) != PA_SIGNAL || !TypeOfMem(Message -> mn_ReplyPort -> mp_SigTask))
return(NULL);
else
Source = Message -> mn_ReplyPort -> mp_SigTask;
if(Source -> pr_Task . tc_Node . ln_Type == NT_PROCESS && Source -> pr_CLI)
{
struct CommandLineInterface *SourceCLI = BADDR(Source -> pr_CLI),
*DestCLI;
if(DestCLI = AllocVec(sizeof(struct CommandLineInterface),MEMF_ANY))
{
CopyMem(SourceCLI,DestCLI,sizeof(struct CommandLineInterface));
if(DestCLI -> cli_SetName = CloneBString(SourceCLI -> cli_SetName,255))
{
if(DestCLI -> cli_CommandName = CloneBString(SourceCLI -> cli_CommandName,255))
{
if(DestCLI -> cli_Prompt = CloneBString(SourceCLI -> cli_Prompt,255))
{
if(DestCLI -> cli_CommandFile = CloneBString(NULL,255))
{
DestCLI -> cli_Result2 = 0;
DestCLI -> cli_ReturnCode = 0;
DestCLI -> cli_Interactive = DOSFALSE;
DestCLI -> cli_Background = DOSFALSE;
DestCLI -> cli_Module = NULL;
if(DestCLI -> cli_CurrentInput = Open("NIL:",MODE_NEWFILE))
{
if(DestCLI -> cli_CurrentOutput = Open("NIL:",MODE_NEWFILE))
{
DestCLI -> cli_StandardInput = DestCLI -> cli_CurrentInput;
DestCLI -> cli_StandardOutput = DestCLI -> cli_CurrentOutput;
DestCLI -> cli_CommandDir = ClonePath(DestCLI -> cli_CommandDir);
return(DestCLI);
}
Close(DestCLI -> cli_CurrentInput);
}
FreeBString(DestCLI -> cli_CommandFile);
}
FreeBString(DestCLI -> cli_Prompt);
}
FreeBString(DestCLI -> cli_CommandName);
}
FreeBString(DestCLI -> cli_SetName);
}
FreeVec(DestCLI);
}
}
return(NULL);
}